package net.kehk.towerdefense.gamelogic;

import java.util.Hashtable;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g2d.Animation;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Ellipse;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array;

/**
 * 
 * @author julien
 *
 */
public class DrawableEntity {
	private float pos_x;
	private float pos_y;
	private float x_offset;
	private float y_offset;
	private float velocity;
	private Hashtable<String, Animation> animations;
	private String current_animation;
	private TextureRegion current_frame;
	private Ellipse hitbox;
	private Vector2 move_vector;
	private boolean delete_flag;

	/**
	 * 
	 * Correspond à toutes les entités affichables
	 * 
	 * @param pos_x Position en x
	 * @param pos_y Position en y
	 * @param velocity Vitesse (0 équivaut à une entité immobile), en pixel par frame
	 * @param width Largeur de l'entité
	 * @param height Hauteur de l'entité
	 */
	public DrawableEntity(float pos_x, float pos_y, float velocity, int width, int height){
		this.pos_x=pos_x;
		this.pos_y=pos_y;
		this.velocity=velocity;
		this.hitbox=new Ellipse((float)(pos_x+(width/2)), (float)(pos_y+(height/2)), (float)(width/2), (float)(height/2));
		this.delete_flag=false;
	}

	/**
	 * 
	 * Récupère la vitesse de l'entité
	 */
	public float getVelocity() {
		return velocity;
	}

	/**
	 * 
	 * Règle la vitesse de l'entité
	 * 
	 * @param velocity
	 */
	public void setVelocity(float velocity) {
		this.velocity = velocity;
	}

	/**
	 * 
	 * Récupère la hitbox de l'entité - cette dernière est une ellipse
	 * 
	 */
	public Ellipse getHitbox() {
		return hitbox;
	}

	public boolean getDeleteFlag(){
		return this.delete_flag;
	}

	public void setDeleteFlag(){
		this.delete_flag=true;
	}

	/**
	 * 
	 * Ajoute une animation
	 * 
	 * @param animation_name Nom de l'animation
	 * @param frames Images composant l'animation
	 * @param duration Durée d'affichage de chaque frame de l'animation
	 */
	public void addAnimation(String animation_name, Array<TextureRegion> frames, int duration){
		this.animations.put("animation_name", new Animation(duration, frames));
	}

	/**
	 * 
	 * Joue une animation
	 * 
	 * @param animation_name nom de l'animation, tel qu'ajouté dans la liste
	 */
	public void playAnimation(String animation_name){
		this.current_animation=animation_name;
	}

	/**
	 * 
	 * Déplace l'entité en fonction d'un vecteur et de sa vitesse
	 * 
	 * @param vector Vecteur indiquant comment déplacer l'entité - nota : l'origine du repère est en haut à gauche de l'affichage
	 */
	public void move(Vector2 vector){
		//TODO empécher l'entité de sortir de l'écran
		this.move_vector=vector;
	}

	public void move(float pos_x, float pos_y){
		this.move_vector=new Vector2(pos_x-this.pos_x, pos_y-this.pos_y);
	}
	
	public void update(int worldWidth, int worldHeight){
		//mouvement
		this.x_offset=velocity*move_vector.nor().x;
		this.y_offset=velocity*move_vector.nor().y;
		this.pos_x+=x_offset;
		this.pos_y+=y_offset;
		this.hitbox.setPosition(hitbox.x+x_offset, hitbox.y+y_offset);
		if(move_vector.len2()>velocity)move_vector.set(move_vector.x-velocity, move_vector.y-velocity);
		else move_vector.set(0, 0);
		//animation
		this.current_frame=animations.get(current_animation).getKeyFrame(Gdx.graphics.getDeltaTime());
	}

	public void render(SpriteBatch sb){
		sb.draw(current_frame, pos_x, pos_y);
	}
}